C++20 の整数
https://www.youtube.com/watch?v=8Q0Teb63NCw
発表資料は以下:
質問・コメント
int と size_t の比較、警告を無視するとこういうトラブルの原因になるので、やむを得ず型を揃えられないときに便利ですね Reputeless.icon
code:cpp
# include <vector>
# include <iostream>
# include <utility>
int main()
{
int a = -1;
std::vector<int> b;
std::cout << std::boolalpha;
std::cout << (a < b.size()) << '\n'; // false (!)
std::cout << std::cmp_less(a, b.size()) << '\n'; // true
}
cmp_less 系関数は警告対策で早く使いたかったのでC++14に移植して使ってます tetsurom.icon
cmp_less 系関数、実行時性能に与える影響が気になります(警告が消える代わりに遅くなるケースがあるか) Reputeless.icon
符号有無の判定はconstexpr ifで行えるので、影響は符号の有無が異なる場合に比較1回だったのが2回になることですね(正負判定+本番の比較)。 なので、負にならないことがわかっているなら、符号なしにキャストして比較すれば1回で済みます tetsurom.icon
for (size_t i = 0; i < v.size(); ++i) だとv.size()がインライン展開されて追加のコストはないですが、cmp_lessの場合はtetsuromさんの言うように正負判定とキャストが追加で必ず入ってしまい、それは最適化がむずかしいかもしれませんね (cpp_akira)
popcount()うれしい!便利!!onihusube.icon
ビット操作系は比較的ニッチな機能なのかなと思っていますw ポータブルになったのは良いことですねぇ。yohhoy.icon
オブジェクトのハッシュ値を自動で求めてくれる将来的な機能ですが、それができる型かどうかを判定するのに使えるstd::has_unique_object_representation という機能はC++17ですでに入ってます (cpp_akira)
std::in_range() 実際に使うときには上に超えてるのか下に超えてるのかも知りたい場合があるかも?範囲と対象の値で異なる型をとれるclamp()があればいいのかもしれないですが。 yak_ex.icon
in_range, 名前的に値 x が min 以上 max 以下に収まるか、という挙動を想像してしまう Reputeless.icon
bool in_range(T x, T min, T max) { return min <= x && x <= max; } という、min と max を指定する的な Reputeless.icon
それが↑の is_clamped() ですね Reputeless.icon